#include <stdio.h>
#include <string.h>

int main()
{
    //FILE *fopen(const char *path, const char *mode);
    //mode:文件打开方式
    //  r   只读，并且文件必须存在，否则打开失败
    //  r+  可读可写， 但是文件必须存在，否则打开失败
    //  w   只写，文件不存在则会创建文件打开，文件存在则会清空文件原有内容打开文件
    //  w+  可读可写， 文件不存在则会创建文件打开，文件存在则会清空文件原有内容打开文件
    //  a   追加只写， 文件不存在则会创建文件打开，文件存在则打开，写入数据时总是会将数据写入文件末尾
    //  a+  可读&追加写，文件不存在则会创建文件打开，文件存在则打开，写入数据时总是会将数据写入文件末尾
    //  b   以二进制方式打开文件 ，否则默认以文本形式打开文件
    FILE *fp = fopen("./test.txt", "rb+");
    if (fp == NULL) {
        perror("fopen error");
        return -1;
    }
    //  fseek(fp, 0, SEEK_SET);//跳转读写位置到，从文件起始位置开始偏移0个字节, 在追加写的时候不起作用，数据依然会被追加到末尾
    char *data = "奥里给\n";
    //size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
    size_t ret = fwrite(data, 1, strlen(data), fp);//文件数据的写入是一种覆盖写入，从读写位置开始覆盖式写入数据
    if (ret != strlen(data)) {
        perror("fwrite error");
        return -1;
    }
    //文件的读写位置，会随着数据的写入不断的向后偏移
    fseek(fp, 0, SEEK_SET);//跳转读写位置到，从文件起始位置开始偏移0个字节

    char buf[1024] = {0};
    //size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
    ret = fread(buf, 1, 1023, fp);
    if (ret == 0) {
        if (ferror(fp)) 
            printf("fread error\n");
        if (feof(fp)) 
            printf("read end of file!\n");
        return -1;
    }
    printf("%d-%s", ret, buf);

    fclose(fp);
    return 0;
}
